[Looker]あるフィールドからのリンク先をExploreごとに変えてみる #looker
さがらです。
Lookerを使用する上で、ある1つのviewを用いて複数のExploreを定義する時、「あるフィールドからのリンク先をExploreごとに変更したい」ということを考えたことのある方、いるのではないでしょうか。
私も最近この課題に直面したため、解決策をまとめてみたいと思います。
前提条件
検証する内容としては、Levi'sなど服のブランドが登録されたbrand
というフィールドに対して、検索結果を表示するリンクを設定することを考えます。brand
というフィールドはproducts
というviewで定義されているとします。
ここで、products
viewをベースとしたExploreを定義するのですが、以下のように2つのExploreに分けることを考えてみます。
products_google
というExploreからは、Google検索の結果にリンクproducts_yahoo
というExploreからは、Yahoo検索の結果にリンク
リンク実装前のベースとなるLookMLの内容は下記のコードになります。
実装前のmodelファイルの内容
# ファイル名:test_explore_link.model connection: "snowlooker" include: "./products.view" explore: products_google { from: products } explore: products_yahoo { from: products }
実装前のviewファイルの内容
# ファイル名:products.view view: products { sql_table_name: "PUBLIC"."PRODUCTS" ;; dimension: brand { type: string sql: ${TABLE}."BRAND" ;; } measure: count { type: count } }
解決策
まず、この問題の解決策としては大きく2つあると思います。
- viewのextendsを使用する
- Liquidを使用する
この2つの方法について、それぞれまとめていきます。
方法その1:viewのextendsを使用する
まず1つ目の方法は、extendsを用いて products_google
というview、 products_yahoo
というview、それぞれ定義する方法です。
この方法で実装した後のコードは下記のようになります。
方法その1実装後のmodelファイルの内容
products_google
というview、 products_yahoo
というview、それぞれ定義するのでincludeが必要になります。
connection: "snowlooker" include: "./products_google.view" include: "./products_yahoo.view" explore: products_google { } explore: products_yahoo { }
方法その1実装後のviewファイルの内容
extends元となるproducts
というview、extends先となるproducts_google
というview、 products_yahoo
というview、合計3つのviewの定義が必要となります。
# ファイル名:products.view view: products { extension: required dimension: brand { type: string sql: ${TABLE}."BRAND" ;; } measure: count { type: count } }
# ファイル名:products_google.view include: "./products.view" view: products_google { extends: [products] sql_table_name: "PUBLIC"."PRODUCTS" ;; dimension: brand { link: { label: "search results by google" url: "http://www.google.com/search?q={{ value | url_encode }}" } } }
# ファイル名:products_yahoo.view include: "./products.view" view: products_yahoo { extends: [products] sql_table_name: "PUBLIC"."PRODUCTS" ;; dimension: brand { link: { label: "search results by yahoo" url: "https://search.yahoo.co.jp/search?p={{ value | url_encode }}" } } }
方法その2:Liquidを使用する
2つ目の方法は、Liquidを駆使する方法です。
link
パラメータ内はLiquidが使用できるので、_explore._name
という現在のExplore名を取得できるLiquid変数とCASEを使って、リンク先を動的に変化させてみます。
この方法で実装した後のコードは下記のようになります。
方法その2実装後のmodelファイルの内容
元のviewの対象となるフィールドだけLiquidの記述が必要なので、modelファイルは実装前の状態から特に変更する必要はありません。
# ファイル名:test_explore_link.model connection: "snowlooker" include: "./products.view" explore: products_google { from: products } explore: products_yahoo { from: products }
方法その2実装後のviewファイルの内容
Liquidを使って場合分けをするため、urlパラメータの内容が少し複雑になります。
ちなみにlabelも方法その1のように変化させることを考えると、同じようなLiquidをlabel側にも書かないといけません。(同じ構成のコードを書いて長くなるだけのため、この例では実装していません。)
# ファイル名:products.view view: products { sql_table_name: "PUBLIC"."PRODUCTS" ;; dimension: brand { type: string sql: ${TABLE}."BRAND" ;; link: { label: "search results" url: "{% case _explore._name %} {% when 'products_google' %} http://www.google.com/search?q={{ value | url_encode }} {% else %} https://search.yahoo.co.jp/search?p={{ value | url_encode }} {% endcase %}" } } measure: count { type: count } }
どう使い分けるべきか?
事例はとてもシンプルな内容でしたが、「あるフィールドからのリンク先をExploreごとに変更する」ための、2つの方法をまとめてみました。
ですが、「どちらを採用すべきなのか?」判断が難しい所だと思いますので、個人的にそれぞれの方法のメリット・デメリット・使いたい場面をまとめて、本ブログを締めたいと思います。
方法その1:viewのextendsを使用する
- メリット
- extends時に他のフィールドも内容を変更したい場合、その変更内容もこの実装のついでにまとめて対応できる
- viewごとに実装することになるため、リンク先を変更したviewを複数のExploreで使い回せる
- デメリット
- 1つリンク先が増える度に、extendsしたviewが増えていってしまう
- 使いたい場面
- あるviewのあるフィールドのリンク先をExploreごとに変更すること以外に、そのviewの中でExploreに応じて内容を変更したいフィールドが他にもたくさんある場合
方法その2:Liquidを使用する
- メリット
- 対象のviewのフィールド内でLiquidを書くだけで済む
- extendsしないため、viewの数が増えなくて済む
- デメリット
- リンク先を分ける必要があるExploreが多い場合、冗長なLiquidを書くことになってしまう
- 使いたい場面
- 実装対象のviewの中で、使用するExploreごとに内容を変更したいフィールドが他にない場合(Exploreごとに変更したい箇所はリンク先だけ、の場合)